home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / bedit / bedit.bas next >
BASIC Source File  |  1991-10-18  |  9KB  |  202 lines

  1. 1000 '
  2. 1010 '  Binary File Editor  BEDIT   Ver1.03             1991/08/28
  3. 1020 '                                   Programed by でんちゃん♪
  4. 1030 '
  5. 1040 '                                         電脳わ~るど DW0001
  6. 1050 '
  7. 1060 DEFLNG A-Z
  8. 1070 DIM ASCII$(15),SEC$(2),X_SM(15),Y_SM(15)
  9. 1080 DIM BUF_FLG(100),BUF_DAT$(100,2),CSR$(2),MODE$(1)
  10. 1090 FOR I=0 TO 100:BUF_FLG(I)=-1:NEXT
  11. 1100 CSR$(0)="<":CSR$(1)=">":CSR$(2)=CHR$(254)
  12. 1110 MODE$(0)="(HEX MODE)":MODE$(1)="(ASC MODE)"
  13. 1120 HEXKEY$="___0Mmミ1Jjモ2Kkネ3Llル4Uuマ5Iiノ6Ooリ777ナ888ニ999ラ"
  14. 1130 HEXKEY$=HEXKEY$+"Aa*ヤBb/ユCc+ヨDd-ワEe=セFf.レ"
  15. 1140 FOR I=1 TO 17:READ A:CTRL$=CTRL$+CHR$(A):NEXT
  16. 1150 DATA 5,8,9,11,12,13,17,18,22,23,26,27,28,29,30,31,127
  17. 1160 DEF FNHEX$(D)   =RIGHT$("0"+HEX$(D),2)
  18. 1170 DEF FNADDR$(D)  =RIGHT$("000000"+HEX$(D),7)
  19. 1180 DEF FNGET(D$,P) =ASC(MID$(D$,P+1,1))
  20. 1190 DEF FNREC$(F$,R)=LEFT$(F$,INSTR(F$,":"))+"("+MID$(STR$(R),2)+")"+                            MID$(F$,INSTR(F$,":")+1)
  21. 1210 CLS:COLOR 7,0:WIDTH 80,25:CONSOLE 22,2,2
  22. 1220 LOCATE  5,0:PRINT "Binary Editor BEDIT  Ver1.03"
  23. 1230 LOCATE 50,0:PRINT "Programed by でんちゃん♪"
  24. 1240 LOCATE  0,2:PRINT "  Addr :+0 +1 +2 +3 +4 +5 +6 +7,+8 +9 +A";
  25. 1250             PRINT " +B +C +D +E +F:SM  <  A S C I I   >"
  26. 1260 PRINT STRING$(76,"-"):A$=SPACE$(7)+":"+SPACE$(23)+","+SPACE$(23)+":"
  27. 1270 FOR Y=0 TO 15:PRINT A$:NEXT
  28. 1280 PRINT STRING$(76,"-"),"  Sum";MID$(A$,6);
  29. 1290 MX_BUF=-1:BUF_NB=-1:GOSUB *OPEN:GOSUB *MODE_PRINT
  30. 1300 GOSUB *CSR_ON:GOSUB *COMMAND:GOTO 1300
  31. 1310 '
  32. 1320 *OPEN
  33. 1330  LOCATE 0,23:LINE INPUT "Filename ? ",FIL$:IF FIL$="" THEN 1330
  34. 1340  LOCATE 50,1:PRINT SPC(30)
  35. 1350  LOCATE 50,1:PRINT LEFT$("Filename = "+FIL$,30)
  36. 1360  OPEN "R",#1,FNREC$(FIL$,256):MX_BLK=LOF(1)
  37. 1370  FIELD #1,128 AS SEC$(0),128 AS SEC$(1)
  38. 1375  FOR I=0 TO 15:FIELD #1,I*16 AS SEC$(2),16 AS ASCII$(I):NEXT
  39. 1380  OPEN "R",#2,FNREC$(FIL$,1):FIELD #2,1 AS SEC$(2):MX_SIZ=LOF(2)
  40. 1390  GOSUB *SIZE_PRINT:MX_DAT$="":IF MX_SIZ MOD 256 ELSE *BLOCK_READ
  41. 1400  FOR I=MX_BLK*256+1 TO MX_SIZ:GET #2,I:MX_DAT$=MX_DAT$+SEC$(2):NEXT
  42. 1410  GOTO *BLOCK_READ
  43. 1420 *BLOCK_READ
  44. 1430  ON SGN(BLK-MX_BLK)+1 GOTO *MAX_READ,*WORK_READ
  45. 1440  ED_FLG=0:GET #1,BLK+1:GOTO *BLOCK_PRINT
  46. 1460  *MAX_READ
  47. 1470   FOR I=0 TO 1:MID$(SEC$(I),1,128)=STRING$(128,CHR$(0)):NEXT
  48. 1480   MID$(SEC$(0),1,128)=MX_DAT$
  49. 1490   IF LEN(MX_DAT$)>128 THEN MID$(SEC$(1),1,128)=MID$(MX_DAT$,129)
  50. 1500   ED_FLG=0:GOTO *BLOCK_PRINT
  51. 1510  *WORK_READ GOSUB *CLS:ED_FLG=0:RETURN
  52. 1520 *BLOCK_MOVE
  53. 1530  IF ED_FLG ELSE 1590
  54. 1540  IF RES=MX_BLK+1 THEN GOSUB *MAX_CHNG
  55. 1550  IF RES=MX_BLK THEN GOSUB *MAX_SET:GOTO 1590
  56. 1560  IF BUF_NB=-1 THEN MX_BUF=MX_BUF+1:BUF_NB=MX_BUF
  57. 1570  FOR I=0 TO 1:BUF_DAT$(BUF_NB,I)=SEC$(I):NEXT:BUF_FLG(BUF_NB)=RES
  58. 1580  IF BUF_NB=99 THEN *OVER
  59. 1590  IF BLK=MX_BLK+2 OR BLK<0 THEN BLK=RES:GOTO *移禁
  60. 1600  BUF_NB=SEARCH(BUF_FLG,BLK):IF BUF_NB>-1 THEN *BUF_READ
  61. 1610  GOTO *BLOCK_READ
  62. 1620  *BUF_READ
  63. 1630   FOR I=0 TO 1:MID$(SEC$(I),1,128)=BUF_DAT$(BUF_NB,I):NEXT
  64. 1640   GOTO *BLOCK_PRINT
  65. 1650  *MAX_SET
  66. 1660   A=MX_SIZ MOD 256:MX_DAT$=LEFT$(SEC$(0),A)
  67. 1670   IF A>128 THEN MX_DAT$=MX_DAT$+LEFT$(SEC$(1),A-128)
  68. 1680   RETURN
  69. 1690 *MAX_CHNG
  70. 1700  MX_BUF=MX_BUF+1:BUF_FLG(MX_BUF)=MX_BLK:MX_BLK=MX_BLK+1
  71. 1710  A$=STRING$(128,CHR$(0))
  72. 1720  BUF_DAT$(MX_BUF,1)=LEFT$(MID$(MX_DAT$,129)+A$,128)
  73. 1730  IF LEN(MX_DAT$)>127 THEN A$=""
  74. 1740  BUF_DAT$(MX_BUF,0)=LEFT$(MX_DAT$+A$,128):RETURN
  75. 1750 *SAVE PRINT "Y"
  76. 1760  IF MX_BUF=-1 THEN 1810
  77. 1770  FOR J=0 TO MX_BUF
  78. 1780   FOR I=0 TO 1:LSET SEC$(I)=BUF_DAT$(J,I):NEXT
  79. 1790   PUT #1,BUF_FLG(J)+1
  80. 1800  NEXT
  81. 1810  A=MX_BLK*256:IF A=MX_SIZ THEN *END
  82. 1820  FOR I=A+1 TO MX_SIZ
  83. 1830   LSET SEC$(2)=MID$(MX_DAT$,I-A,1):PUT #2,I
  84. 1840  NEXT:GOTO *END
  85. 1850 *END CLOSE:END
  86. 1860 '
  87. 1870 *BLOCK_PRINT
  88. 1880  FOR X=0 TO 15:Y_SM(X)=0:NEXT:Z_SM=0:Y=0:GOTO *PRINT
  89. 1890 *HARF_PRINT
  90. 1900  IF Y_SIT=0 THEN *BLOCK_PRINT
  91. 1910  Z_SM=0
  92. 1920  FOR XP=0 TO 15
  93. 1930   Y_SM(XP)=0
  94. 1940   FOR YP=0 TO Y_SIT-1
  95. 1950    Y_SM(XP)=Y_SM(XP)+FNGET(ASCII$(YP),XP)
  96. 1960   NEXT
  97. 1970   Z_SM=Z_SM+Y_SM(XP)
  98. 1980  NEXT
  99. 1990  Y=Y_SIT:GOTO *PRINT
  100. 2000  *PRINT
  101. 2010   LOCATE 0,Y+4:B=BLK*256
  102. 2020   FOR YP=Y TO 15
  103. 2030    L$=FNADDR$(B+YP*16):X_SM(YP)=0
  104. 2040    FOR XP=0 TO 15
  105. 2050     DAT=FNGET(ASCII$(YP),XP):L$=L$+" "+FNHEX$(DAT)
  106. 2060     X_SM(YP)=X_SM(YP)+DAT:Y_SM(XP)=Y_SM(XP)+DAT
  107. 2070    NEXT
  108. 2080    MID$(L$,8,1)=":":MID$(L$,32,1)=",":PRINT L$+":"+FNHEX$(X_SM(YP))
  109. 2090    Z_SM=Z_SM+X_SM(YP):YL=YP+4:GOSUB *ASC_PRINT
  110. 2100   NEXT
  111. 2110   L$=""
  112. 2120   FOR X=0 TO 15:L$=L$+" "+FNHEX$(Y_SM(X)):NEXT:MID$(L$,25,1)=","
  113. 2130   LOCATE 8,21:PRINT MID$(L$,2)+":"+FNHEX$(Z_SM);:GOTO *KEY_CLR
  114. 2140 *SM_PRINT
  115. 2150  XL=X_SIT*3+8:YL=Y_SIT+4
  116. 2160  LOCATE 56,YL:PRINT FNHEX$(X_SM(Y_SIT))
  117. 2170  LOCATE XL,YL:PRINT FNHEX$(CHNG)
  118. 2180  LOCATE XL,21:PRINT FNHEX$(Y_SM(X_SIT));
  119. 2190  LOCATE 56,21:PRINT FNHEX$(Z_SM);:GOTO *ASC_PRINT
  120. 2200 *ASC_PRINT
  121. 2205  IF ASC_FLG THEN RETURN
  122. 2210  A=YL*19:LINE (480,A)-STEP(136,19),PRESET,,BF
  123. 2220  SYMBOL(480,A),ASCII$(YL-4),1,1,7:RETURN
  124. 2230 *CSR_ON  COLOR 15:GOTO 2250
  125. 2240 *CSR_OFF COLOR  7:CLS 1
  126. 2250  GOSUB *DAT_GET:Y=Y_SIT+4:A=MODE*2+BEAM
  127. 2260  LOCATE X_SIT*3+BEAM+8,Y:PRINT MID$(DAT$,BEAM+1,MODE+1)
  128. 2270  SYMBOL(X_SIT*8+480,Y*19),CSR$(A),1,1,2^A,,XOR:RETURN
  129. 2280 *SIZE_PRINT LOCATE 61,21:PRINT "FileSize $"+FNADDR$(MX_SIZ);:RETURN
  130. 2290 *MODE_PRINT LOCATE  2, 1:PRINT MODE$(MODE):RETURN
  131. 2300 *移禁 LOCATE 0,23:PRINT "移行できません":RETURN
  132. 2310 *OVER LOCATE 0,23:PRINT "これ以上の編集はできませんので、終了します"
  133. 2320       GOTO *EOF
  134. 2330 '
  135. 2340 *COMMAND
  136. 2350  GOSUB *KEY_IN:GOSUB *CSR_OFF
  137. 2360  ON INSTR(CTRL$,KEY_DAT$) GOTO *EL,*BS,*TAB,*HOME,*CLS,*CR,*DUP,*INS,           *BACK,*NEXT,*EOF,*ESC,*MV_R,*MV_L,*MV_U,*MV_D,*DEL
  138. 2370  IF MODE THEN *ASC_SET ELSE *HEX_SET
  139. 2380  *EL   ED_FLG=1
  140. 2390        MID$(ASCII$(Y_SIT),X_SIT+1,16)=STRING$(16,CHR$(0))
  141. 2400        BEAM=0:GOTO *HARF_PRINT
  142. 2410  *BS   ED_FLG=1:P=Y_SIT*16+X_SIT:IF P ELSE 2470
  143. 2420        IF P>128 THEN GOSUB 2450 ELSE GOSUB 2440
  144. 2430        GOTO *HARF_PRINT
  145. 2440        MID$(SEC$(0),P,128)=MID$(SEC$(0),P+1)+SEC$(1):P=129
  146. 2450        MID$(SEC$(1),P-128,128)=MID$(SEC$(1),P-127)
  147. 2460        BEAM=0:GOSUB *MV_L:BEAM=0:RETURN
  148. 2470        GOSUB *DAT_GET:CHNG=DAT:P=1:GOSUB 2440:GOTO *DAT_CHNG
  149. 2480  *TAB  LOCATE 0,23:GOSUB *KEY_CLR:INPUT "Move Address ? $",A$
  150. 2490        IF A$="MAX" OR A$="max" THEN SIZ=MX_SIZ:GOTO 2520
  151. 2500        SIZ=VAL("&H"+A$)
  152. 2510        IF (INSTR(A$,"0")=0 AND SIZ=0) OR SIZ>MX_SIZ THEN *移禁
  153. 2520        REC=BLK:BLK=INT(SIZ/256)+1
  154. 2530        Y_SIT=INT((SIZ MOD 256)/16):X_SIT=SIZ MOD 16
  155. 2540        IF REC=BLK THEN RETURN ELSE *BLOCK_MOVE
  156. 2550  *HOME BEAM=0:X_SIT=0:Y_SIT=0:RETURN
  157. 2560  *CLS  FOR I=0 TO 1:MID$(SEC$(I),1,128)=STRING$(128,CHR$(0)):NEXT
  158. 2570        ED_FLG=1:GOTO *BLOCK_PRINT
  159. 2580  *CR   BEAM=0:X_SIT=0:GOTO *MV_D
  160. 2590  *DUP  ASC_FLG=ASC_FLG XOR 1:RETURN
  161. 2600  *INS  ED_FLG=1:P=Y_SIT*16+X_SIT+1:A$=CHR$(0)
  162. 2610        IF Y_SIT>7 THEN 2640
  163. 2620        A$=RIGHT$(SEC$(0),1)
  164. 2630        MID$(SEC$(0),P,128)=CHR$(0)+MID$(SEC$(0),P):P=129
  165. 2640        MID$(SEC$(1),P-128,128)=A$+MID$(SEC$(1),P-128)
  166. 2650        BEAM=0:GOTO *HARF_PRINT
  167. 2660  *NEXT RES=BLK:BLK=BLK+1:GOTO *BLOCK_MOVE
  168. 2670  *BACK RES=BLK:BLK=BLK-1:GOTO *BLOCK_MOVE
  169. 2680  *EOF  RES=BLK:BLK=0:GOSUB *BLOCK_MOVE
  170. 2690        LOCATE 0,23:PRINT "セーブしますか? [Y,N] >";:GOSUB *KEY_CLR
  171. 2700        GOSUB *KEY_IN:A=INT(INSTR("_YyNn",KEY_DAT$)/2)
  172. 2710        ON A GOTO *SAVE,*END:RETURN
  173. 2720  *ESC  BEAM=0:MODE=MODE XOR 1:GOTO *MODE_PRINT
  174. 2730  *MV_R IF MODE ELSE BEAM=BEAM XOR 1:IF BEAM THEN RETURN
  175. 2740        X_SIT=X_SIT+1 AND 15:IF X_SIT=0 THEN *MV_D ELSE RETURN
  176. 2750  *MV_L IF MODE ELSE BEAM=BEAM XOR 1:IF BEAM ELSE RETURN
  177. 2760        X_SIT=X_SIT-1 AND 15:IF X_SIT=15 THEN *MV_U ELSE RETURN
  178. 2770  *MV_U Y_SIT=Y_SIT-1 AND 15:IF Y_SIT=15 THEN *BACK ELSE RETURN
  179. 2780  *MV_D Y_SIT=Y_SIT+1 AND 15:IF Y_SIT= 0 THEN *NEXT ELSE RETURN
  180. 2790  *DEL  BEAM=1:GOSUB *MV_R:BEAM=0:GOTO *BS
  181. 2800 '
  182. 2810 *HEX_SET A=INT(INSTR(HEXKEY$,KEY_DAT$)/4)-1:IF A<0 THEN RETURN
  183. 2820          GOSUB *DAT_GET:MID$(DAT$,BEAM+1,1)=HEX$(A)
  184. 2830          CHNG=VAL("&h"+DAT$):GOSUB *DAT_CHNG:GOTO *MV_R
  185. 2840 *ASC_SET CHNG=ASC(KEY_DAT$):IF CHNG<32 THEN RETURN
  186. 2850          GOSUB *DAT_GET:GOSUB *DAT_CHNG:GOTO *MV_R
  187. 2860 *DAT_CHNG
  188. 2870  GOSUB *DAT_SET:A=CHNG-DAT:GOSUB *SIZE_CHK
  189. 2880  X_SM(Y_SIT)=X_SM(Y_SIT)+A:Z_SM=Z_SM+A
  190. 2890  Y_SM(X_SIT)=Y_SM(X_SIT)+A:ED_FLG=1:GOTO *SM_PRINT
  191. 2900 '
  192. 2910 *KEY_IN  KEY_DAT$="":WHILE KEY_DAT$="":KEY_DAT$=INKEY$:WEND:RETURN
  193. 2920 *KEY_CLR WHILE INKEY$<>"":WEND:RETURN
  194. 2930 *DAT_GET
  195. 2940  DAT=FNGET(ASCII$(Y_SIT),X_SIT):DAT$=FNHEX$(DAT):RETURN
  196. 2950 *DAT_SET
  197. 2960  MID$(ASCII$(Y_SIT),X_SIT+1,1)=CHR$(CHNG):RETURN
  198. 2970 *SIZE_CHK
  199. 2980  SIZ=BLK*256+Y_SIT*16+X_SIT+1
  200. 2990  IF SIZ<=MX_SIZ THEN RETURN
  201. 3000  MX_SIZ=SIZ:GOTO *SIZE_PRINT
  202.